C++11新特性: lambda表达式的使用介绍 - sbw Blog

C++11新特性: lambda表达式的使用介绍

来源: 石博文博客 | 浏览: 8274 | 评论: 0 发表时间: 2014-02-12

在C++11中,加入了lambda表达式这个新特性,使用lambda表达式可以方便的创建出"匿名函数".在某个函数只在某处使用一次,又不想占用一个变量名时,就可以使用lambda函数来解决.但由于lambda表达式是个"新玩意儿",在实际代码中大量使用它,可能会使代码可读性降低,毕竟并不是所有人都精通c++,尤其它还是一个c++11的新特性.



介绍

其实Lambda表达式也可以很复杂.这里我们只讨论一些简单的使用方法,原因有两个:一是因为作为一个匿名函数,通常它都是用来实现简单直观的"小功能",所以一些复杂晦涩的语法很少用到,二是因为Lambda表达式完全可以被普通函数替代,如果一个Lambda表达式很复杂的话,为了程序可读性,还是把它写成一个函数好一些:)


一个简单的Lambda表达式的定义形如下面的样子:


A: 捕获

A部分: "捕获",意思其实就是声明Lambda表达式内部对外部变量的控制权限是引用还是复制(只读).一般写法如下:


A1: a为复制参数的值,只读而不可写. b为引用传参. c, d 变量在Lambda内部不可访问.

A2: 第一个 '&' 表示默认参数为引用捕获,而后面声明以复制传递了a,b 所以在A2中a,b为复制 c,d为引用.

A3: '=' 表示默认参数为复制捕获,而后面又声明a为复制传递,在这里g++会报出一个警告,表示我们重复声明了a的捕获方式.而b将以引用被捕获, c,d以复制方式被捕获.

特别需要说明的是,如果Lambda表达式在一个类内部使用,那么this指针也会被当作一个变量参与捕获.


B: 参数

因为Lambda表达式可以说是匿名的函数,所以在参数部分完全和普通函数一样.


C: 返回值

使用"-> type"来声明Lambda表达式的返回值,这一部分是可以省略的,编译器会根据return的类型来推导返回值,而如果要在return时完成变量的类型转换,就要写出返回值类型(比如返回一个bool型而return了一个int型).


D: 函数体

这部分也和普通的函数完全一样.


Lambda表达式示例

在STL中有sort函数,可以对一个序列排序,它的第三个参数通常为一个函数,用来执行两个item的比较,这个地方也可以用Lambda表达式来代替:


在这个例子中使用了两个Lambda表达式,在sort函数中,比较两个结构的大小就使用了一个,它捕获了一个count变量,用来计算Lambda表达式的执行次数.返回一个bool型,来表示两个结构体的大小.在for_each中,Lambda表达式输出了每一个结构的两个成员.它没有捕获任何外部变量.


这个例子中以引用捕获了j,以复制捕获了i,由于执行到Lmabda表达式时i的值为1,所以在Lambda表达式内部,i总为1,所以这个例子的输出应该是:1,2,3 1,5,6


更多有关Lambda表达式的语法规则可以查看MSDN.




没有人评论过此文,还不快抢个沙发
  • 昵称: *
  • 邮箱:
  • 网址:
  • 记住我的信息
  • Color
  • Red
  • Blue
  • Code
  • bash
  • cpp
  • css
  • java
  • js
  • perl
  • php
  • python
  • ruby
  • sql
  • xml